package qdu.rg012.ch2_service_adv;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

/**
 * android消息机制
 * 对异步线程进行安全化。
 * 安卓中UI线程要求实现线程安全，不允许非UI线程对UI元素进行直接访问。
 * Only the original thread that created a view hierarchy can touch its views
 * 若其他线程要对UI线程进行访问，需要使用Handler（遵守android的ui线程安全）
 ******************************************
 * 实现消息处理
 * 1）在UI线程中（需要线程安全的线程中），创建Handler对象
 * 2）在handler对象中重写handleMessege函数，该函数是当前线程接收到异步消息后的处理方式
 * 3）在异步线程中，需要将数据信息包装成Message对象，并发送给handler（前提是该异步线程知晓handler对象的存在）。
 */
public class Test_msg extends Activity {
    static boolean flag = false;
    TextView mytv;
    class Myhandler extends Handler{
        @Override
        public void handleMessage(@NonNull Message msg) {
            //在handler接收到消息时回调
            super.handleMessage(msg);
            switch (msg.what){
                case 13:
                    mytv.setText(msg.getData().getString("msg"));
                    break;
            }
        }
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ly_testmsg);
        Myhandler mh = new Myhandler();
        mytv = findViewById(R.id.tv_showmsg);
        mytv.setText("flag:" + flag);
        View.OnClickListener mylistnr = new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                switch (view.getId()){
                    case R.id.btn_1:
                        flag = true;
                        new Thread(){
                            public void run(){
                                while(flag){
                                    Log.i("mytag", "time:" + System.currentTimeMillis());
                                    //mytv.setText("time:" + System.currentTimeMillis());
                                    //Message msg = new Message();自定义消息对象
                                    Message msg = Message.obtain();//获取系统消息池的消息对象
                                    //打包消息
                                    msg.what = 13;
                                    Bundle bd = new Bundle();
                                    bd.putString("msg","time:" + System.currentTimeMillis());
                                    msg.setData(bd);
                                    //发送消息 给handler
                                    mh.sendMessage(msg);
                                    try {
                                        Thread.sleep(500);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                        }.start();
                        break;
                    case R.id.btn_2:
                        flag = false;
                        mytv.setText("flag:" + flag);
                        break;
                }
            }
        };

        findViewById(R.id.btn_1).setOnClickListener(mylistnr);
        findViewById(R.id.btn_2).setOnClickListener(mylistnr);
    }
}
